/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../helper_objs/head.h"
#include "../helper_proc/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "../msg/head.h"
#include "objs.h"
#include "hook.h"
#include "mgr.h"

namespace xos_http
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container* container_ptr = 0;
    static mgr * mgr_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {
        m_pOdbcConnectPool = 0;
        m_pModuleProp = 0;
        m_pUserData = 0;
        m_pNotify = 0;
    }

    mgr::~mgr()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( xos_container::i_container * pContainer, net::i_module** ppv )
    {
        return xos_stl::static_init_module( pContainer, ppv, container_ptr, mgr_ptr );
    }

    xos_container::i_container* mgr::container()
    {
        return container_ptr;
    }

    mgr* mgr::get()
    {
        return mgr_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    // 
    // 1.如果查找到，就返回
    // 2.如果没找到，按ppFile的情况处理：
    // 
    // ppFile的不同情况：
    // 
    // 1.为null，什么都不做，表明只是一个普通查询
    // 2.*ppFile为null，则创建一个file对象，并清加进去
    // 3.*ppFile不为null，则直接添加它
    // 
    file * mgr::get_file_or_add_or_create_if_not_find( const char * lpszUri, file ** ppFile, bool bAutoRelease )
    {
        file * pRet = 0;
        xos_stl::auto_lock<thread_lock> lock( &m_module_lock );
        pRet = (file *)m_pModuleProp->obj( lpszUri );
        if( !pRet && ppFile )
        {
            file * pFile = 0;
            if( *ppFile )
            {
                pFile = *ppFile;
            }
            if( !pFile )
            {
                xos_stl::init_pool_item( pFile );
            }
            m_pModuleProp->set_obj( lpszUri, pFile, bAutoRelease );
            *ppFile = pFile;
            pRet = pFile;
        }
        return pRet;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    // 
    // net::i_module
    // 

    int mgr::set_heart_check_interval_ms( int n_heart_interval_ms )
    {
        int ret = 0;
        config::get()->heart_check_interval_ms = n_heart_interval_ms;
        return ret;
    }

    int mgr::set_caller_callback( xos_box::i_notify * pNotify )
    {
        int ret = 0;
        helper_main::set_thread( pNotify->get_cur_thread() );
        helper_caller_callback::set_callback( pNotify );
        if( !m_pNotify )
        {
            m_pNotify = helper_main::get()->clone();
            m_pNotify->set_msg_type( MSG_TYPE_NOTIFY );
        }
        return ret;
    }

    int mgr::set_net_callback( xos_box::i_notify * pNotify )
    {
        int ret = 0;
        helper_net_callback::set_callback( pNotify );
        return ret;
    }

    xos_box::i_notify * mgr::get_callback()
    {
        return m_pNotify;
    }

    int mgr::set_user_data( void* pUserData )
    {
        int ret = 0;
        m_pUserData = pUserData;
        return ret;
    }

    void* mgr::get_user_data()
    {
        return m_pUserData;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            ret = hook::init();
        }

        if( 0 == ret )
        {
            m_pOdbcConnectPool = container()->odbc()->connect_pool( config::get()->db_connect_str.c_str() );
            mgr::container()->config()->set( "xos_http_odbc_connect_pool", m_pOdbcConnectPool, false );
            xos_odbc::i_connect * pC = m_pOdbcConnectPool->get();
            m_pOdbcConnectPool->put( pC );
        }

        if( 0 == ret )
        {
            m_pModuleProp = container()->box()->get_str_prop();
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pOdbcConnectPool );
        xos_stl::release_interface( m_pModuleProp );
        xos_stl::release_interface( m_pNotify );
        hook::term();
        return ret;
    }

} // xos_http
